001    /**
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: Apr 27, 2003
005     * Time: 9:18:07 PM
006     */
007    
008    package EVolve.util.phasedetectors;
009    
010    import EVolve.visualization.XYViz.XYVisualization;
011    import EVolve.visualization.Visualization;
012    import EVolve.Scene;
013    import EVolve.util.HelperFuncs;
014    import java.util.*;
015    
016    public class PhaseClipboard {
017        private ArrayList copiedPhase;
018        private XYVisualization source;
019        private HashSet targetList;
020        private ArrayList sourceTimeMap, targetTimeMap;
021        private int sourceInterval, targetInterval;
022        private boolean isEmpty;
023    
024        public PhaseClipboard() {
025            isEmpty = true;
026            targetList = new HashSet();
027        }
028    
029        public void copyPhase() {
030            ArrayList phaseList = null;
031            source = HelperFuncs.getActiveXYViz();
032    
033            if ((source == null)||(source.getPhaseDetector()==null)) {
034                Scene.showErrorMessage("No phase information available.");
035                return;
036            }
037    
038            sourceTimeMap = source.getTimeMap();
039            sourceInterval = source.getInterval();
040            phaseList = source.getPhaseDetector().getPhase();
041            if (phaseList.size() == 0) {
042                Scene.showErrorMessage("No phase information available.");
043                return;
044            }
045    
046            copiedPhase = HelperFuncs.cloneArrayList(phaseList);
047            if (copiedPhase.size() > 0) isEmpty = false;
048        }
049    
050        public void pastePhase() {
051            XYVisualization target = null;
052    
053            if (copiedPhase == null) {
054                Scene.showErrorMessage("No phase data available, please copy phase first.");
055                return;
056            }
057    
058            target = HelperFuncs.getActiveXYViz();
059            if (target == null) {
060                Scene.showErrorMessage("Can not paste phase to non-HotSpotVisualization.");
061                return ;
062            }
063    
064            if (source.getDataSourceId() != target.getDataSourceId()) {
065                Scene.showErrorMessage("Can not paste phases to a visualization generated from a different data source");
066                return;
067            }
068    
069            PhaseDetector detector = target.getPhaseDetector();
070            if (detector == null) return;
071    
072            if (!targetList.contains(target))
073                targetList.add(target);
074    
075            targetTimeMap = target.getTimeMap();
076            targetInterval = target.getInterval();
077            ArrayList phases = translatePhase();
078    
079            detector.pastePhases(phases);
080        }
081    
082        public boolean isEmpty() {
083            return isEmpty;
084        }
085    
086        private ArrayList translatePhase() {
087            ArrayList translated = new ArrayList();
088            ArrayList eventNoList = new ArrayList();
089    
090            for (int i=0; i<copiedPhase.size(); i++) {
091                Integer phase = (Integer)copiedPhase.get(i);
092                long event = findEventNo(sourceTimeMap, phase.intValue()+1,sourceInterval);
093                eventNoList.add(new Long(event));
094            }
095    
096            for (int i=0; i<eventNoList.size(); i++) {
097                Long event = (Long)eventNoList.get(i);
098                long time = findTime(targetTimeMap, event.longValue());
099                translated.add(new Integer((int)(time/targetInterval)));
100            }
101    
102            return translated;
103        }
104    
105        private long findTime(ArrayList timeMap, long eventNo) {
106            long prevEvent = 0, curEvent = 0;
107            long time = 0;
108    
109            for (int i=0; i<timeMap.size(); i++) {
110                long[] time2Event = (long[])timeMap.get(i);
111                curEvent = time2Event[1];
112                time = time2Event[0];
113                if ((prevEvent == eventNo) || (curEvent == eventNo) ||
114                    ((prevEvent < eventNo) && (eventNo < curEvent))) {
115                    break;
116                }
117                prevEvent = curEvent;
118            }
119    
120            return time;
121        }
122    
123        private long findEventNo(ArrayList timeMap, int time, int interval) {
124            long prevTime = 0, curTime = 0;
125            long event = 0;
126    
127            for (int i=0; i<timeMap.size(); i++) {
128                long[] time2Event = (long[])timeMap.get(i);
129                curTime = time2Event[0];
130                if ((prevTime/interval == time) || (curTime/interval == time) ||
131                    ((prevTime/interval < time) && (time < curTime/interval))) {
132                    break;
133                }
134                event = time2Event[1];
135                prevTime = curTime;
136            }
137    
138            return event;
139    
140        }
141    }